<?php

namespace plugin\tuCrontabs\app\services;

use plugin\tuCrontabs\app\common\event\EventBootstrap;
use plugin\tuCrontabs\app\model\CrontabLogModel;
use plugin\tuCrontabs\app\model\CrontabModel;
use support\facade\Logger;

class CrontabService
{
    // 获取所有的任务
    static function getTaskAll($field='*'){
        return CrontabModel::where(['status'=>1])->select($field)->get();
    }

    /**
     * 传入ID 获取指定的一条任务
     * @param $id
     * @return mixed
     */
    static function getTask($id){
        return CrontabModel::find($id);
    }

    /**
     * config/plugin/yzh52521/throttle/app.php
     * @param $id
     * @return array
     */
    static function runOneTask($id){
        /**  @var $task_handle EventBootstrap[] */
        $task_handle = config('plugin.tuCrontabs.app.task_handle');
        $crontab = CrontabModel::find($id);
        $start_time = microtime(true);

        try {
            if(!$crontab) throw new \Exception( '执行任务失败, 任务不存在' );
            if (!isset($task_handle[$crontab['type']]))throw new \Exception( '执行任务失败, 任务类型错误: ');
            $result_data = $task_handle[$crontab['type']]::parse($crontab);
            // 记录执行信息
            $crontab->last_running_time = $start_time;
            $crontab->increment('running_times',1);
            if($crontab->singleton==0){
                // 单次任务 直接停用
                $crontab->status = 0;
            }
            if(!$crontab->save())throw new \Exception('记录保存失败');
            $end_time = microtime(true);
//            $result_data['log'] = "{$start_time} __ {$end_time}";
            if(strlen($result_data['log'])>300){
                $result_data['log'] = mb_substr($result_data['log'],0,300).'...';
            }
            // 写入执行日志
            $installData = [
                'crontab_id' => $crontab['id'] ?? '',
                'target' => $crontab['target'] ?? '',
                'log' =>  $result_data['log']??'--',
                'return_code' => $result_data['code']??1,
                'running_time' => round($end_time - $start_time, 6),
                'create_time' => $start_time,
            ];
            if(!CrontabLogModel::insertGetId($installData))throw new \Exception('日志记录保存失败');
        }catch (\Exception $e){
            return ['code' => 1, 'log' => $e->getMessage().'---任务id: '.$id];
        }
        return [
            'code'=>$installData['return_code'],
            'log'=>$installData['log'],
            'crontab_id'=>$installData['crontab_id'],
        ];

    }
}